# 1.集合（set）元素去重的判断依据是什么
# 同时满足两个条件：
#       使用__eq__方法判断集合中的元素值是否相等
#       使用__hash__方法判断集合中的元素哈希值相同
# 2.总结本周视频讲解魔术方法的作用及什么情况会执行到该方法
# 实例化__new__:创建一个新的对象调用父类的__new__方法，该方法需要返回一个值，如果该值不是cls的实例，则不会调用初始化__init__
# 初始化__init__:创建一个新的对象时先调用__new__方法创建，再使用__init__方法将实例的属性初始化
# __str__：如果配置是print(实例)打印出的是内存地址，配置__str__设置返回值可以打印出我们指定显示的内容格式，只针对str()、print()、format()函数调用时起作用，改变对象的字符串显示，如果没有定义，就会用调用__repr__方法返回字符串表达，如果__repr__也没有定义，就调用object的__str__，直接返回对象的内存地址
# __repr__：跟__str__内容类似，改变打印时显示的内容，先查看__str__，如果没有就查看__repr__是否定义
# __bytes__: 将一个对象转换成字节模式
# __bool__：如果没有配置时，对象实例永远为True，使用__bool__可以针对将对象的属性放在逻辑表达式的位置，调用这个函数返回布尔值。
# __lt__, __le__, __eq__, __gt__, __ge__, __ne__：一般情况下是对int、float等类型的比较，不能进行实例对象的比较,使用这些方法可以实现两个对象之间的比较，在类中可以实现针对实例的哪些属性的比较
# __add__, __sub__, __mul__, __truediv__, __mod__, __floordiv__, __pow__, __divmod__：正常情况下，两个对象之间不支持加减乘除的运算，使用这些方法可以实现两个对象之间的加减乘除等操作，在类中可以实现针对实例的哪些属性的加减乘除
# __iadd__, __isub__, __imul__, __itruediv__, __imod__, __ifloordiv__, __ipow__：实现对象的 +=、-=、*=等赋值运算操作
# __len__：返回对象的长度，把对象当做容器类型
# __iter__:迭代容器时调用，返回一个新的迭代器对象
# __contains__：实现 in 成员 判断，没有实现，就调用__iter__方法遍历
# __getitem__ ：实现self[key]访问
# __setitem__ ：和__getitem__的访问类似，实现self[key]=value赋值
# __missing__: 字典或其子类使用__getitem__()调用时，key不存在执行该方法
# __call__: 类中定义实例就像函数一样可以调用
# __enter__: 进入与此对象相关的上下文，如果存在该方法，with语法会把该方法的返回值作为绑定到as字句中指定的变量上
# __exit__: 退出与此对象相关的上下文
# __getattr__()：通过搜索实例、实例的类及祖先类查不到属性，就会调用此方法
# __setattr__()：通过访问实例属性，进行增加，修改都要调用它
# __delattr__()：通过实例来删除属性时调用此方法
# __getattribute__:实例的所有的属性访问，第一个都会去调用__getattribute__方法，他阻止了属性的查找，该方法应该有返回值或者抛出一个异常作为属性的访问的结果
# __hash__：调用的返回值，返回一个整数。如果定义这个方法该类的实例就可hash。
# __hash__：设置一个返回值，可以将对象进行哈希

# 3.结合本周所学内容，实现如下类：

class Ob:
    def __init__(self, name):
        self.name = name
        self.items = ['1', '2']

    def __str__(self):
        return str(self.items)

    def __setitem__(self, key, value):
        self.items[key] = value

    def __mul__(self, other):
        self.items *= other

    def __len__(self):
        return len(self.items)

    def __delitem__(self, key):
        del self.items[key]

    def __repr__(self):
        return "<Ob name={} items={}".format(self.name,self.items)

    def __hash__(self):
        return hash(self.name)

    def __eq__(self, other):
        return self.name == other.name


a = Ob('tom')
b = Ob('tom')
print('a:', a)
a[0] = 'a'
print('a: ', a)
a * 3
print("len:", len(a))
del a[1]
print('a:', a)
print(a)
print(b)
print('set:', {a, b})
